﻿using Microsoft.Extensions.VectorData;

namespace WYD.Model.AI.RAG;

/// <summary>
/// 表示从 Markdown 文档中分割出的一个文本块，用于向量检索。
/// </summary>
public class DocumentChunk
{
    /// <summary>
    /// 唯一键，通常为自增 ID 或哈希值
    /// </summary>
    [VectorStoreKey]
    public ulong Id { get; set; }

    /// <summary>
    /// 文档来源文件名，例如 "input.md"
    /// </summary>
    [VectorStoreData(IsIndexed = true)]
    public string SourceFile { get; set; } = string.Empty;

    /// <summary>
    /// 内容在原文中的起始字符位置（可选）
    /// </summary>
    [VectorStoreData(IsIndexed = true)]
    public int StartIndex { get; set; }

    /// <summary>
    /// 文本块的内容（已清理、分段后的 Markdown 或纯文本）
    /// </summary>
    [VectorStoreData(IsFullTextIndexed = true)]
    public string Content { get; set; } = string.Empty;

    /// <summary>
    /// 文本块的嵌入向量（1024 维，对应 BAAI/bge-m3）
    /// </summary>
    [VectorStoreVector(
        Dimensions: 1024,
        DistanceFunction = DistanceFunction.CosineSimilarity,
        IndexKind = IndexKind.Hnsw)]
    public ReadOnlyMemory<float>? Embedding { get; set; }

    /// <summary>
    /// 可选：章节标题，用于增强上下文理解
    /// </summary>
    [VectorStoreData(IsIndexed = true)]
    public string? SectionTitle { get; set; }

    /// <summary>
    /// 可选：时间戳
    /// </summary>
    [VectorStoreData(IsIndexed = true)]
    public DateTimeOffset CreatedAt { get; set; } = DateTime.UtcNow;
}